/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package negocio;

import datos.Certificado;
import datos.EmpresaContratista;
import datos.EstadoCertificado;
import datos.Obra;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
@Stateless
public class GestorCertificadoBean implements GestorCertificadoRemote, GestorCertificadoLocal {

    static Logger logger = Logger.getLogger(GestorCertificadoBean.class);
    public static void log4j (Exception e){

         /**
         * Primero obtenemos la url del archivo de configuración,
         * como están en el mismo paquete que la clase Main lo podemos obtener con el método getResource().
         */
        URL url = GestorCertificadoBean.class.getResource("/configuracion/log4j.properties");

        /**
         * Despues cargamos el archivo de configuración
        */
        PropertyConfigurator.configure(url);
        logger.error(e);
    }
    @PersistenceContext
    private EntityManager em;
    
    /***
     * Retorna lista con instancias de Certificado cuyo idObra sea igual al
     * parametro idObra.
     * @param idObra
     * @return lista de certificados por obra.
     * Interfaz local
     */

    public List verCertificadosObra (int idObra){
        try{
            javax.persistence.Query q = em.createNamedQuery("Certificado.encontrarPorObra");
            q.setParameter("idObra", idObra);
            return q.getResultList();
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return null;
        }
    }

    /***
     * Retorna lista con instancias de Certificado cuyo idObra sea igual al
     * parametro idObra.
     * @param idObra
     * @return lista de certificados por obra.
     * Interfaz remota
     */
    public List verCertificadosObraRemote (int idObra){
        try{
            javax.persistence.Query q = em.createNamedQuery("Certificado.encontrarPorObra");
            q.setParameter("idObra", idObra);
            return q.getResultList();
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return null;
        }
    }

    /***
     * 
     * @param object
     */
    public void persist(Object object) {
        em.persist(object);
    }

    /***
     * Agrega una nueva instancia de Certificado a la base de datos
     * @param nroCertificado
     * @param periodo
     * @param fechaMedicion
     * @param monto
     * @param fondos
     * @param nroOrdenPago
     * @param estado
     * @param idObra
     * @param idEmpresaContratista
     * @return true si el nuevo certificado persistió, false si no persistió
     * Interfaz local
     */
    public boolean agregarCertificado(int nroCertificado, String periodo, Date fechaMedicion, BigDecimal monto,
            String fondos, int nroOrdenPago, String estado, int idObra, int idEmpresaContratista){
        try{
            Certificado cert = new Certificado();
            cert.setFechaMedicion(fechaMedicion);
            cert.setFinancieroParcial(new BigDecimal("0.0"));
            cert.setFinancieroAcumulado(new BigDecimal("0.0"));
            cert.setFondos(fondos.toUpperCase());
            cert.setMonto(monto);
            cert.setPeriodo(periodo.toUpperCase());
            cert.setNumero(nroCertificado);
            Obra obra = (Obra)em.find(Obra.class, idObra);
            cert.setPorcentajeFinanciero(0.0f);
            cert.setIdObra(obra);
            EmpresaContratista emp = (EmpresaContratista)em.find(EmpresaContratista.class, idEmpresaContratista);
            cert.setIdEmpresaContratista(emp);
            EstadoCertificado est = this.encontrarEstadoCertificado(estado.toUpperCase());
            cert.setIdEstado(est);
            persist(cert);
            em.flush();
            return true;
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Agrega una nueva instancia de Certificado a la base de datos
     * @param nroCertificado
     * @param periodo
     * @param fechaMedicion
     * @param monto
     * @param fondos
     * @param nroOrdenPago
     * @param estado
     * @param idObra
     * @param idEmpresaContratista
     * @return true si el nuevo certificado persistió, false si no persistió
     * Interfaz remota
     */
    public boolean agregarCertificadoRemote(int nroCertificado, String periodo, Date fechaMedicion, BigDecimal monto,
            String fondos, int nroOrdenPago, String estado, int idObra, int idEmpresaContratista){
        try{
            Certificado cert = new Certificado();
            cert.setFechaMedicion(fechaMedicion);
            cert.setFinancieroParcial(new BigDecimal("0.0"));
            cert.setFinancieroAcumulado(new BigDecimal("0.0"));
            cert.setFondos(fondos.toUpperCase());
            cert.setMonto(monto);
            cert.setPeriodo(periodo.toUpperCase());
            cert.setNumero(nroCertificado);
            Obra obra = (Obra)em.find(Obra.class, idObra);
            cert.setPorcentajeFinanciero(0.0f);
            cert.setIdObra(obra);
            EmpresaContratista emp = (EmpresaContratista)em.find(EmpresaContratista.class, idEmpresaContratista);
            cert.setIdEmpresaContratista(emp);
            EstadoCertificado est = this.encontrarEstadoCertificado(estado.toUpperCase());
            cert.setIdEstado(est);
            persist(cert);
            em.flush();
            return true;
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instancia de Certificado en la base de datos.
     * @param idCertificado
     * @param nroCertificado
     * @param periodo
     * @param fechaMedicion
     * @param monto
     * @param fondos
     * @param nroOrdenPago
     * @param estado
     * @return true si el certificado fue actualizado con exito, false si no fue actualizado
     * Interfaz local
     */
    public boolean modificarCertificado(int idCertificado, int nroCertificado, String periodo, Date fechaMedicion, BigDecimal monto,
            String fondos, int nroOrdenPago, String estado){
        try{
            Certificado cert = em.find(Certificado.class, idCertificado);
            cert.setFechaMedicion(fechaMedicion);
            cert.setFinancieroParcial(new BigDecimal("0.0"));
            cert.setFinancieroAcumulado(new BigDecimal("0.0"));
            cert.setFondos(fondos.toUpperCase());
            cert.setMonto(monto);
            cert.setPeriodo(periodo.toUpperCase());
            cert.setNumero(nroCertificado);
            cert.setPorcentajeFinanciero(0.0f);
            EstadoCertificado est = this.encontrarEstadoCertificado(estado.toUpperCase());
            cert.setIdEstado(est);
            persist(cert);
            em.flush();
            return true;
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Actualiza una instancia de Certificado en la base de datos.
     * @param idCertificado
     * @param nroCertificado
     * @param periodo
     * @param fechaMedicion
     * @param monto
     * @param fondos
     * @param nroOrdenPago
     * @param estado
     * @return true si el certificado fue actualizado con exito, false si no fue actualizado
     * Interfaz remota
     */
    public boolean modificarCertificadoRemote(int idCertificado, int nroCertificado, String periodo, Date fechaMedicion, BigDecimal monto,
            String fondos, int nroOrdenPago, String estado){
        try{
            Certificado cert = em.find(Certificado.class, idCertificado);
            cert.setFechaMedicion(fechaMedicion);
            cert.setFinancieroParcial(new BigDecimal("0.0"));
            cert.setFinancieroAcumulado(new BigDecimal("0.0"));
            cert.setFondos(fondos.toUpperCase());
            cert.setMonto(monto);
            cert.setPeriodo(periodo.toUpperCase());
            cert.setNumero(nroCertificado);
            cert.setPorcentajeFinanciero(0.0f);
            EstadoCertificado est = this.encontrarEstadoCertificado(estado.toUpperCase());
            cert.setIdEstado(est);
            persist(cert);
            em.flush();
            return true;
        }catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Elimina una instancia de Certificado cuyo id coincida con el parametro idCertificado.
     * @param idCertificado
     * @return true si el certificado fue eliminado con exito, false si no fue eliminado
     * Interfaz local
     */

    public boolean eliminarCertificado(int idCertificado) {
        try {
            Certificado cert = em.find(Certificado.class, idCertificado);
            em.remove(cert);
            return true;
        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Elimina una instancia de Certificado cuyo id coincida con el parametro idCertificado.
     * @param idCertificado
     * @return true si el certificado fue eliminado con exito, false si no fue eliminado
     * Interfaz remote
     */
    public boolean eliminarCertificadoRemote(int idCertificado) {
        try {
            Certificado cert = em.find(Certificado.class, idCertificado);
            em.remove(cert);
            return true;
        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return false;
        }
    }

    /***
     * Retorna una instancia de tipo EstadoCertificado cuyo nombre coincida
     * con el parametro nombre.
     * @param nombre
     * @return estado del certificado
     * Interfaz local
     */
    public EstadoCertificado encontrarEstadoCertificado(String nombre){
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoCertificado.findByNombre");
            q.setParameter("nombre", nombre);
            return (EstadoCertificado)q.getSingleResult();

        }
        catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return null;}

    }

    /***
     * Retorna una instancia de tipo EstadoCertificado cuyo nombre coincida
     * con el parametro nombre.
     * @param nombre
     * @return estado del certificado
     * Interfaz remote
     */
    public EstadoCertificado encontrarEstadoCertificadoRemote(String nombre){
        try{
            javax.persistence.Query q = em.createNamedQuery("EstadoCertificado.findByNombre");
            q.setParameter("nombre", nombre);
            return (EstadoCertificado)q.getSingleResult();

        }
        catch(Exception e){
            GestorCertificadoBean.log4j(e);
            return null;}

    }

    /***
     * Retorna el Acumulado Financiero, la suma acumulada del campo financiero parcial,
     * para una Obra en particular cuyo id coincida con el parametro idObra.
     * @param idObra
     * @return la suma acumulada del campo financiero parcial por obra
     * Interfaz local
     */

    public BigDecimal calcularAcumuladoFinancieroPorObra(int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Certificado.calcularAcumulado");
            q.setParameter("idObra", idObra);
            return (BigDecimal) q.getSingleResult();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna el Acumulado Financiero, la suma acumulada del campo financiero parcial,
     * para una Obra en particular cuyo id coincida con el parametro idObra.
     * @param idObra
     * @return la suma acumulada del campo financiero parcial por obra
     * Interfaz remote
     */

     public BigDecimal calcularAcumuladoFinancieroPorObraRemote(int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Certificado.calcularAcumulado");
            q.setParameter("idObra", idObra);
            return (BigDecimal) q.getSingleResult();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }

     /***
      * Retorna el Acumulado Financiero, la suma acumulada del campo financiero parcial,
      * para una Obra y Certificado en particular cuyos ID coincidan con el parametro idObra
      * y idCertificado respectivamente.
      * @param idCertificado
      * @param idObra
      * @return la suma acumulada del campo financiero parcial por obra y certificado
      * Interfaz local
      */

    public BigDecimal calcularAcumuladoFinancieroModificarPorObra(int idCertificado, int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Certificado.calcularAcumuladoModificar");
            q.setParameter("idObra", idObra);
            q.setParameter("id", idCertificado);
            return (BigDecimal) q.getSingleResult();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna el Acumulado Financiero, la suma acumulada del campo financiero parcial,
     * para una Obra y Certificado en particular cuyos ID coincidan con el parametro idObra
     * y idCertificado respectivamente.
     * @param idCertificado
     * @param idObra
     * @return la suma acumulada del campo financiero parcial por obra y certificado
     * Interfaz remote
     */

     public BigDecimal calcularAcumuladoFinancieroModificarPorObraRemote(int idCertificado, int idObra) {
        try {
            javax.persistence.Query q = em.createNamedQuery("Certificado.calcularAcumuladoModificar");
            q.setParameter("idObra", idObra);
            q.setParameter("id", idCertificado);
            return (BigDecimal) q.getSingleResult();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }

     /***
      * Retorna una lista de los nombres de todas las instancias de EstadoCertificado
      * @return lista de los estados de los certificados
      * Interfaz local
      */
    public List estadosCertificado() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoCertificado.encontrarTodosPorNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }

    /***
     * Retorna una lista de los nombres de todas las instancias de EstadoCertificado
     * @return lista de los estados de los certificados
      * Interfaz remote
     */
    public List estadosCertificadoRemote() {
        try {
            javax.persistence.Query q = em.createNamedQuery("EstadoCertificado.encontrarTodosPorNombre");
            return q.getResultList();

        } catch (Exception e) {
            GestorCertificadoBean.log4j(e);
            return null;
        }

    }
}
